iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1
自我挑戰組

網頁服務開發之路系列 第 9

ColdFusion: ColdFusion MX 網站威力實作 part1

  • 分享至 

  • xImage
  •  

線上編輯器: TryCF

  1. cfset 設定變數
    1. scope scope
    2. cfparam <cfparam>
  2. 流程控制 流程控制
    1. if <cfif>
    2. switch <cfswitch>
    3. loop <cfloop>
    4. include <cfinclude>
  3. 複雜類型資料 複雜類型資料
    1. 字串處理 字串處理
    2. regular 正規運算式
    3. array 陣列
    4. list 清單
    5. structures 結構
  4. function UDF與CFScript程式
    1. built-in ColdFusion 內建函式 (時間函式)
    2. cffunction <cffunction>建立自訂函數
    3. cfscript CFScript
    4. useCfscript 使用CFScript自訂函式

設定變數

語法: <cfset var1="Hello!">
規定:

  1. 變數名稱最多包涵底線 _$ ,其他符號都不行
  2. 避免保留字
  3. 變數名稱不分大小寫,cold 與 COLD 是相同的變數
  4. 駝峰式命名

型態: number, boolean, string, array date, list, structure, query, object

註解

<!--- ... --->

作用: 1. 把CFML的變數內容或函式傳回值輸出到網頁, 2. 輸出資料庫的查詢結果。

#

#包起來,提醒coldfusion輸出字串前,先處理被#包起來的變數或函式

<cfset dateTime = Now()>
<cfoutput>
  當前時間: #dateTime#
</cfoutput>
  • NOTE: #為特殊意義, 要輸出#或是包含#的變數(顏色...)時,使用##
    <cfoutput>
    <font color="##FFOOOO">顏色</font>
    </cfoutput>
    

如果少打一個#,Coldfusion會認為FFOOOO為一個變數而出錯

&

作用: 串聯字串,但 沒有 Javasript+ 的運算功能

<cfset msg1="歡迎">
<cfset msg2="#msg1# 光臨">
<cfset msg3="msg1 光臨">
<cfset msg4=msg1&"光臨">

結果: msg2="歡迎光臨", msg3="msg1 光臨", msg4="歡迎光臨"

scope (有效範圍)

Coldfusion 透過在變數名稱前面加上前置詞,控制變數的有效範圍與來源。

  1. 前置詞與變數名稱之間用(.)區隔
<cfset Variables.myDog = "Lucky">
<cfoutput>
Dos' Name: #Variables.myDog#
</cfoutput>

前置詞: Variable, Form, URL, Cookie, Server, Client, ...

  1. function 內的前置詞: [#arg argument.參數], [#this this.變數],控制變數只在在function中有效

<cfparam>

避免因變數尚未定義,產生的錯誤
三個基本屬性: name, default, type

<cfparam name="UR:.id" default="1" type="any">

流程控制

<cfif>, <cfswitch>, <cfloop>, <cfinclude>

<cfif>

  1. 語法:
<cfif 條件敘述>
  條件成立,執行這裡
<cfelse>
  條件不成立,執行這裡
</cfif> 
  1. 比較運算子:
    1. eq: 等於,也可以寫成 is, equal
    2. neq: 不等於is not, not equal
    3. gt: 大於,也可以寫成greater than
    4. lt: 小於,也可以寫成less than
    5. ge: 大於等於,也可以寫成greater than or equal to , gte
    6. le: 小於等於,也可以寫成less than or equal to, lte
    7. contain: 包含,範例"ColdFusion MX" contain "MX" 將回傳true
    8. does not contain: 不包含
  • NOTE: 字串如果與數字做比較,ColdFusion會嘗試將字串,轉為數字或日期在比較,如果無法轉換會出現錯誤訊息
  1. 關於時間: 字串中的"3p","p"會被解釋為"PM","a"會被解釋為"Am",以下範例條件式會成立
    <cfset hr = "3p">
    <cfif ht is "15:00">
      現在時間下午3點
    </cfif>
    
  2. 邏輯運算子: 1.and, or, not
    1. xor: true加false,false加true,兩種情況才會回傳true
    2. eqv: true加true,false加false,兩種情況才會回傳true
    3. imp: true加false,會回傳false

<cfswitch>

效率比一連串ifesle好,易讀

  1. 語法:
    <cfset number=3>
    <cfswitch expression="#number#">
    
      <cfcase value="1">
        符合條件值時,執行這裡
      </cfacse><cfcase value="2"></cfcase><cfcase value="3"></cfcase>
    
    </cfswitch>
    
  2. 但只能判斷 完全相等的條件,不能用大於, 小於...
  3. 可以測試某個範圍的值,不同的值用逗號分開
    <cfcase value="1, 3">
      變數NUMBER 可能是1 或3
    </cfcase>
    
  4. 不可以有 不同case都符合的條件,例如
    <cfcase value="1, 2"></cfcase>
    <cfcase value="1, 3"></cfcase>
    
  5. delimiters: 可以設定分開的符號,範例: <cfcase value"banana|orange" delimiters="|">

<cfloop>

索引迴圈、條件迴圈

  1. 索引迴圈
    • 根據一個數字範圍重複執行循環內容
    1. 語法
      <cfloop index="counter" from="1" to="5" step="2">
        大家好! <br>
      </cfloop>
      
    • NOTE: step 為一步的距離,如果沒寫代表每次 + 1
  2. 條件迴圈
    • 只要條件為 true 就會不斷執行,直到條件變為 false
    1. 語法:
      <cfset counter=1>
      <cfloop condition="counter LT 6">
        大家好! <br>
        <cfset counter = counter + 1>
      </cfloop>
      

<cfinclude>

在頁面中包含另外一個網頁,好讓我們替網站頁面嵌入統的頁眉(header)與頁腳(footer)

複雜類型資料

字串處理、規則運算式、清單(list)、Array、Structure 變數

字串處理

  1. 字串相連: <cfset str=#x# & #y#>
  2. 去除多餘空格: 用戶可能不經意在資料前後輸入多餘的空白,
    1. 可以用Trim(): <cfset user = Trim(Form.userName)>
    2. RTrim(): 去除第一個非空白字元的之前空格; LTrim(): 去除最後一個非空白字元的之後空格;
  3. 比較字串: Compare(str1, str2)
    <cfset str1="apple Pie">
    <cfset str2="APPLE">
    <cfset order=Compare(str1, str2)>
    <cfoutput>
    <cfswitch expression="#order#">
      <cfcase value="-1">
        #str1# 大於 #str2#
      </cfcase>
      <cfcase value="0">
        #str1# 等於 #str2#
      </cfcase>
      <cfcase value="1">
        #str1# 小於 #str2#
      </cfcase>
    </cfswitch>
    </cfoutput>
    
    1. str1 與 str2 相等: 回傳 0
    2. str1 大於 str2: 回傳 1
    3. str1 小於 str2: 回傳 -1
    • NOTE: 比較的原則 alphabetical order ,且與字串的大小寫有關,指大小寫無關用CompareNoCase()
  4. 搜尋字串: Find()
    1. 語法: Find(搜尋字串, 被搜尋字串 [, 搜尋起點]),大小寫有差別
    2. 忽略大小寫使用 FindNoCase()
    3. 假設要檢查email是否存在表單中,以檢查@來達成
      <!-- 讀取 email 表單欄位的值 -->
      <cfset email=Form.email>
      <!-- Len(): 字串長度 -->
      <cfset emailLen=Len(email)>
      <!-- 找尋 @ -->
      <cfset firstAt = Find("@", email)>
      <!-- 找不到時 firstAt = 0 -->
      <cfset secondAt = Find("@", mail, firstAt + 1)>
      <cfif sescondAt is not 0>
        e-mail 只能有一個 @ 字元
        <cfabort>
      <cfelseif firstAt LTE 1 OR firstAt is emailLen>
        請仔細填寫 e-mail !
      </cfif>
      
    • NOTE: 增加了兩條規則 1. email只能有一個"@"; 2. "@" 不能出現在字首, 字尾
  5. 替換字串
    1. 語法: Replace(來源字串, 要被替換字串, 替換內容, 搜尋範圍)
    2. 與大小寫無關使用: ReplaceNoCase()
    3. 搜尋範圍只有兩種輸入值: 1. one 只替換第一個找到的; 2. all 替換所有找 到的
    4. 範例: 把 str1 裡面的 apple 全部換成 orange
      <cfset str1="apple Pie apple sida apple juice">
      <cfset str2=Replace(str1, "apple", "orange", "all")>
      <cfoutput>
        替換前: #str1#
        <br>
        替換後: #str2#
      </cfoutput>
      
  6. 取出部分字串
    1. 語法: Mid(字串, 起始編號, 字數),範例
      <cfset email="ColdFusion@yahoo.com.tw">
      <cfoutput>
        網域名稱: #Mid(email, 12, 5)#
      </cfoutput>
      
    2. Left(字串, 字數): 從左邊開始數; Right(字串, 字數): 從右邊開始數
    3. 假設 @ 之前的字串當作使用者名稱,@之後當作網域
      <cfset email="ColdFusion@yahoo.com.tw">
      <cfset indexEmail=Find("@", email)>
      <cfset userName=Left(email, indexEmail-1)>
      <cfset emailLen=Len(email)>
      <cfset domainName=Right(email, emailLen-indexEmail)>
      <cfoutput>
        使用者名稱: #userName#
        <br>
        網域: #domainName#
      </cfoutput>
      

正規運算式 (Regular Expression)

上面的搜尋方式為找到指定的字元,這邊可以透過特殊字元搜尋目邊的起始位子、出現頻率、字元的範圍等等

  1. 範例:<cfset result=REFind("ColdFusion", "ColdFusion@yahoo.com")>,result的值為字元的位子
  2. 與大小寫無關: REFindNoCase("規則", 字串)
  3. ^: 開頭; $: 結尾; "^cubie$"表示目標字串需要完全吻合
  4. 脫逸序列
    1. \t: 定位字元
    2. \s: 任何空白字元(包含定位鍵以及換行...)
    3. \S: 任何 非 空白字元
    4. \d: 任何數字
    5. \D: 任何 非 數字
    6. \w: 任何字母與數字
    7. \W: 任何 非 字母與數字
    • NOTE: 匹配\, ,, ., -使用\\, \,, \., \-
  5. 字元集合: 比對字元範圍
    1. [a-z]: 任何小寫字母
    2. [a-zA-Z]: 任何大小寫字母
    3. [0-9]: 任何數字
    4. [a-zA-Z0-9.]: 任何大小寫字母, 數字, "."符號
    5. [[:punct:]]: 匹配任何標點符號 (POSIX字元集合)
    • 範例: <cfset result=REFindNoCase("^[^0-9][a-z0-9]$", target)>
  6. 匹配多重字元
    1. {n}: 匹配 n 個數量字元,如 p{2}將匹配 "apple" 和 "apple" 的前面兩個 p
    2. {n, }: 匹配 n 個或多個數量的字元
    3. {n, m}: 匹配 n~m 個字元
  7. 特殊字元
    1. *: 匹配多次 *字元,範例: bo* 將匹配 "book" 的 boo與 "bike" 裡面的 b
    2. ?: 匹配 一次 ?之前的字元,範例: books? 將匹配 book 與 books
    3. +: 匹配多次 +之前的字元,範例: o+ 匹配 "book" 裡面 的 oo 與 "booook" 裡的 oooo
    4. .: 匹配第 一個吻合以外 的所有字元,範例: .c匹配 "clock" 的第二個 c
    5. x|y: 匹配 x 或 y,範例: black|white|gray,匹配 "black", "white" 或 "gray"
      回顧: email搜尋可以改寫為[\w]+@[\w]+\.[\w\.]+

清單 (List)

  1. 建立清單
    1. 語法: <cfset listData="材, 米, 油, 鹽">
    2. 將查詢結果轉成清單函式
      1. 語法: ValueList(資料查詢名稱.資料欄位 [, 界定符號])
      2. 將清單的元素加上單引號'語法: QutedValueList(bookTitle.title, ";")
    3. 範例: 假設 book 資料表的 title 欄位包含 "ActionScript", "ColdFusion", "ASP.Net"
      <cfquery name="bookTitle" datasource="bookStore">
          SELECT title FROM books
      </cfquery>
      <cfset titleList=ValueList(bookTitle.title, ";")>
      //result: ActionScript;ColdFusion;APS.Net
      <cfset titleList=QuetedValueList(bookTitle, ";")>
      //result: 'ActionScript';'ColdFusion';'APS.Net'
      
    • NOTE: <cfquery>為查詢資料庫標籤的指令
  2. 求取清單 元素個數
    1. 語法: ListLen(list, "")
    2. list 為清單容, ""為界定符號,預設是逗號
    • NOTE: 清單中緊緊相鄰的分隔字元(中間沒有空格),將不被納入元素計算
  3. 取出特定清單元素
    1. 語法: ListGetAt(清單, 位置編號, 界定符號)
  4. 增加清單元素
    1. ListAppend(清單, 值, 界定符號) : 指定的值放在清單元素最後
    2. ListPrepend(清單, 值, 界定符號) : 指定的值放在清單元素之前
    3. ListInsertAt(清單, 位置編號, 值, 界定符號) : 指定值放在指定位置
    • NOTE: 1.1 用 <cfset listData=newValue & "," & listData>的方式效率更好
  5. 刪除清單元素
    1. ListDeleteAt(清單, 位置編號, 界定符號)
  6. 遍覽清單元素
    <cfset listData="材;米;油;鹽">
    <cfset i=1>
    <cfloop index="item" list="#listData#" delimiters=";">
    <cfoutput>
    元素 #i# : #item# <br>
    </cfoutput>
    <cfset i = i + 1>
    </cfloop>
    
  7. 搜尋清單元素
    1.ListFind(搜尋對象, 要搜尋的內容): 可以搜尋、匹配清單的元素內容,只能和找尋對象一模一樣的內容
    2. ListFindNoCase(搜尋對象, 要搜尋的內容): 不分大小寫
    3. 把尚未購買的商品找出來,範例:
    javascript <cfset listData="材,米,油,鹽"> <cfset orderList="米,鹽"> 尚未購買的商品: <br> <!-- <cfloop> 中的index,把每次迴圈取出的值暫存到product --> <cfloop list="#listData#" index="product"> <cfif ListFind(orderList, product) is 0> <cfoutput> #product#<br> </cfoutput> </cfif> </cfloop>
  8. 找尋元素部分內容
    1. ListContains(搜尋對象, 要搜尋的內容): 比對包含搜尋內容的元素,回傳0(失 敗), 1(成功)
    2. ListContainsNoCase(搜尋對象, 要搜尋的內容): 不分大小寫
    3. 範例: 找出不分大小寫的"flash"元素
      <cfset listData = "Flash MX,FlashComm,Dreamviewer,flash ROM">
      包含"flash"字串的元素: <br>
      <cfloop list=#listData# index="word">
          <cfset result=ListContainsNoCase(word, "flash")>
          <cfif result neq 0>
              <cfoutput>
                  #word#<br>
              </cfoutput>
          </cfif>
      </cfloop>
      
  9. 統計清單元素的出現次數
    1. ListValueCount(統計對象, 項目): 統計項目出現次數
    2. ListValueCountNoCase(): 不分大小寫
    3. 範例: 投票結果
      <cfset listData="贊成,反對,沒意見">
      <cfset voteList="贊成,反對,沒意見,贊成,贊成,反對,反對,沒意見,沒意見,贊成,贊成,沒意見,反對,反對">
      <h3>投票結果</h3>
      <cfloop list=#listData# index="vote">
          <cfoutput>
              #vote#: #ListValueCount(voteList, vote)# 票<br>
          </cfoutput>
      </cfloop>
      

陣列變數 (Array)

儲存許多相關資料,需要使用Array,Array元素從1開始依序編號

  1. <cfset myArray = ArrayNew(1)>: 建立Array,!ArrayNew()裡面的參數,代表維度,不是數量
  2. Arrayset(陣列變數的名稱,起始編號,結束編號,初始值): 初始化Array的函式
  3. Array物件方法
    1. AaaryLen() : 傳回長度
    2. ArrayAppend(array, 值): 加入新的元素在array最後,成功會回傳True
    3. ArrayPrepend(array, 值): 加入新的元素在array開頭,成功會回傳True
    4. ArrayInsertAt(array,位置,值): 指定位置插入新的元素,成功會回傳True
    5. ArrayDeleteAt(array, 位置): 指定位置刪除元素,刪除後後面元素自動遞補,成功會回傳True
    6. ArraySwap(array,位置1,位置2): 交換位置1與位置2的元素,成功會回傳True
    7. ArrayClear(array): 清除array內容,成功會回傳True
    8. ArrayIsEmpty(array): 確認array是否沒有任何元素,沒有的話回傳True
    9. ArraySort(array, 排序類型[,排列順序]): 排序完成回傳True
      1. Numeric: 按照數字,所有元素須包含數字
      2. Text: 按照字母
      3. TextnoCase: 按照字母,忽略大小寫
      4. 順序: Asc 升冪(預設), Desc 降冪
    10. ArrayToList(array, 分格符號): 將array換成列表,用分格符號分隔字串(輸出到網頁上常用)
    11. ArrayResize(array, 指定大小): 將array重新設定為指定大小
    • 範例: 排序後輸出
      <cfset scoresArray = ArrayNew(1)>
      <cfset scoresArray[1] = 77>
      <cfset scoresArray[2] = 66>
      <cfset scoresArray[3] = 88>
      <cfoutput>
          原始內容: #ArrayToList(scoresArray, ", ")#<br>
      </cfoutput>
      <cfset temp=ArraySort(scoresArray, "Numeric")>
      <cfoutput>
          排序後: #ArrayToList(scoresArray, ", ")#
      </cfoutput>
      
  4. 運算函式
    1. ArrayAvg(array): 平均值
    2. ArrayMax(array): 最大值
    3. ArrayMin(array): 最小值
    4. ArraySum(array): 總和
    • 範例:
      <cfset scoresArray = ArrayNew(1)>
      <cfset scoresArray[1] = 77>
      <cfset scoresArray[2] = 66>
      <cfset scoresArray[3] = 88>
      <cfoutput>
          總分:#ArraySum(scoresArray)#<br>
          平均:#ArrayAvg(scoresArray)#<br>
          最高:#ArrayMax(scoresArray)#<br>
          最低:#ArrayMin(scoresArray)#<br>
      </cfoutput>
      

結構 Structures

結構變數就是 命名陣列(Associate Array),一般Array都是透過索引編號參照元素位置,結構變數可以用名稱來參照,這個名稱叫做 鍵值(key)

  1. <cfset bookData = StructNew()>: 建立結構變數
  2. <cfset bookData["title"] = "MX 與 XML 動態網站實作">: 設定key
  3. 使用[=#cfdump <cfdump>]標籤檢視資料:
    • 除了用<cfoutput>顯示變數內容外,一般變數內容不可見的。<cfdump>可以輸出內容讓我們開法更方便,var為必要參數
    1. var: 指定查看的變數名稱,變數名稱要用##包起來
    2. expand: boolean(Yes, No),設定是否展開結構內容,預設Yes,如果設No,始會列出結構的Key,不顯示內容
    3. label: 設定標題文字
    4. 範例
      <cfset bookData["title"] = "Flash MX">
      <cfset bookData["author"] = "Harry">
      <cfset bookData["price"] = 680>
      <cfdump var=#bookData# label="書籍資料">
      
  4. 結構變數的函式
    1. IsStruct(變數): 判斷變數是否是結構,回傳True, False
    2. StructCount(): 計算Key數量
    3. StructEmpty(結構變數名稱):
    4. StructKeyExists(結構變數名稱, "key"): 判斷指定的key 是否存在
    5. StructKeyList(結構變數名稱, 分界符號): 取出結構變數中的關鍵值
    6. StructKeyArray(結構變數名稱): 找尋結構中的key
    7. StructDelete(結構變數名稱, key[, indicateNotExisting]): 刪除結構中特定的元素
    8. StructClear(結構變數名稱): 清除結構中的全部資料
    9. Duplicate(): 複製結構,存放在不同記憶體,兩邊不影響
    10. StructCopy(): 複製結構,參照原有結構的記憶體,改任何一邊結構將影響另一邊結構
    11. 範例:
      <cfset bookData["title1"] = "Flash MX 寶典">
      <cfset bookData["title2"] = "Flash XML 動態網站">
      <cfset bookData["title3"] = "Dreamviewer">
      <cfloop index="counter" from="1" to="#StructCount(bookData)#" step="1">
          <cfoutput>
              第#counter# 本書: #bookData["title" & counter]#<br>
          </cfoutput>
      </cfloop>
      

UDF與CFScript程式

內建函式 (時間函式格式)

  1. TimeFormat(date[,mask]): 可以自訂時間的顯示格式,mask值如以下:
    1. H: 顯示12時制,1~9時 沒有 前導0
    2. Hh: 顯示24時制,1~9時 有 前導0
    3. HH: 顯示24時制,1~9時 有 前導0
    4. M: 1~9 沒有 前導0的分鐘數
    5. mm: 1~9 有 前導0的分鐘數
    6. S: 1~9 沒有 前導0的秒數
    7. Ss: 1~9 有 前導0的分鐘數
    8. T: 上午或下午的標記,顯示A 或P 值
    9. Tt: 上午或下午的標記,顯示AM 或 PM 值
    • 範例:
      <cfoutput>
          時間格式一: #TimeFormat(Now())#
          <br>
          時間格式二: #TimeFormat(Now(), "hh:mm:ss tt")#
      </cfoutput>
      
  2. DateFormat(date[,mask]): 可以自訂日期的顯示格式,mask值如以下:
    1. d: 顯示一位或兩位數的日期,1~9時前面沒有0
    2. dd:顯示兩位數日期,1~9前面有0
    3. ddd: 顯示星期簡寫,如 Mon, Tue...
    4. dddd: 顯示星期全名,如 Monday
    5. m: 顯示一位或兩位的月份,1~9前面沒有0
    6. mm: 顯示兩位的月份,1~9前有有0
    7. mmm: 顯示月份簡寫,如 Jan ...
    8. mmmm: 顯示月份全名,如 January ...
    9. y:顯示一位或兩位數的年份,1~9前面沒有0
    10. yy: 顯示兩位數的年份,1~9前面有0
    11. yyyy: 顯示四位數的年份
    • 範例:
      <cfoutput>
          時間格式一: #DateFormat(Now(), "yyyy/mm/dd")#
          <br>
          時間格式二: #DateFormat(Now(), "dddd, mmmm dd, yyyy")#
      </cfoutput>
      
  3. 區域性 (not work)
    1. LSTimeFormat(date, [,mask]): 區域性時間函數
    2. LSDateFormat(date, [,mask]): 區域性日期函數
    3. 範例
      <cfoutput>
      #LSTimeFormat(Now(), "hh:mm:ss tt")#
      </cfoutput>
      <cfoutput>
          時間格式一: #LSDateFormat(Now())#
          <br>
          時間格式二: #LSDateFormat(Now(), "yyyy年 mmmd 日 ddd")#
      </cfoutput>
      
  4. IsDefined: 確認變數是否定義,回傳true代表有,false 代表沒有

<cffunction>

  1. 語法:
    <cffunction name="函數名稱" [returnType="傳回類型" roles="角色列表"     access="存取類型" output="布林值"]>
    程式內容
    <cfreturn 運算式>
    </cffunction>
    
  2. <cfargument name="引數名稱" [Type="類型" required="布林值" default="預設值"]>: 定義涵式的引數
    • 範例: 華式, 攝氏溫度轉換
      <cffunction name="CFconverter">
          <cfargument name="degree" default="0">
          <cfargument name="type" default="C2F">
          <cfif type EQ "C2F">
              <cfset degree = 9/5*degree+32>
          <cfelse>
              <cfset degree = 5/9*(degree-32)>
          </cfif>
          <cfreturn DecimalFormat(degree)>
      </cffunction>
      
      <cfoutput>
          #CFconverter(20, "C2F")#
      </cfoutput>
      
  3. function 內使用參數時會用 argument.參數,用來指定scope
  4. this.變數: 函式區域變數
    • 範例
      <cffunction name="CtoF">
      <cfargument name="degree">
      <cfset this.result=9/5*degree+32>
      <cfreturn this.result>
      </cffunction>
      

CFScript 撰寫

常被用來變數設定, 條件判斷, 迴圈, 自訂函數
寫法與JS相似,但是在伺服器運行

基本要點

  1. <cfscript></cfscript>一定要放程式,不能只放註解,不然會錯
  2. 程式敘述結尾要加 ; ,不然會錯
  3. 不能使用其他ColdFusion的標籤指令,但可以使用ColdFusion的函式與運算子
  4. 運算子要用ColdFusion的運算子[#運算子 CF運算子]
  5. 程式裡面,變數一定要事先宣告,並且賦於值,不然會錯
  6. cfscript 不分大小寫
  7. 註解寫法與JS相同,///* */
  8. 變數輸出設定:
    1. 不可以在function 以外的地方用var
    2. 觀察輸出結果用WriteOutput()<cfoutput>不能用
    3. 輸出特殊字元,重複一遍該字元,範例
      <cfscript>
      WriteOutput("這是""MX""版本");
      //result: 這是"MX"版本
      <cfscript>
      
  9. 設定Array與Structure
    1. Array 範例:
      <cfscript>
        softArray = ArrayNew(1);
        softArray[1] = "Flash";
        softArray[2] = "yaiud";
      </cfscript>
      
    2. Structure 範例:
      <cfscript>
        user = StructNew();
        user.ID = FORM.userID;
        user.name = FORM.userName;
      </cfscript>
      

CFScript 邏輯判斷

  1. if...else...: 注意,比較運算子是CF的比較運算子,範例:
    <cfset version = "MX">
    <cfscript>
        if(version eq "MX"){
          WriteOutput("""MX""是最新的版本");
        } else if(version eq "5.0"){
          WriteOutput("5.0版也是很強大。");
        } else {
          WriteOutput("更新一下");
        }
    </cfscript>
    
  2. switch...case: 注意,要加break,程式會一直執行到break或是default才離開switch,語法:
    switch(變數){
      case 特定值 1:
        //特定值 1 情況的程式碼
        break;
      case 特定值 2:
        //特定值 2 情況的程式碼
        break;
      default:
        //條件都不符合的情況,執行的程式碼
    }
    

CFScript 迴圈控制

  1. while:
    1. MOD: 取餘數的運算子
    2. continue: 強迫迴圈回到判斷式執行,不會執行continue後面的程式
    3. 範例: 1 加到 5,但只加偶數
      <cfscript>
      i = 1;
      ans = 0;
      while(i LTE 5){
        if((i MOD 2) NEQ 0){
          i += 1;
          continue;
         }
         ans += i;
         i += 1;
       }
       WriteOutput("運算結果:" &ans);
      </cfscript>
      
  2. for: 範例
    <cfscript>
    i = 1;
    ans = 0;
    for(i = 1; i LTE 5; i++){
      ans = ans + i;
    }
     WriteOutput("運算結果: #ans#");
    </cfscript>
    

使用CFScript 自訂函式

  1. 格式
    <cfscript>
    function functionName(){
    // 程式碼
    }
    </cfscript>
    
  2. var 必須在function程式內容的開頭
  3. 區域變數必須給定初始值
  4. function 內使用參數時會用 argument.參數,用來指定scope
  5. 引數陣列,範例
    <cfscript>
    function argTest(){
      var args = ArrayLen(Arguments);
      writeOutput("引數的數量: " &args& "<br>");
      for(i = 1; i LTE args; i++){
        writeOutput("第" & i & "個引數值: " & Arguments[i] & "<br>");
        }
    }
    </cfscript>
    
    <cfoutput>
        #argTest(20, "Hello")#
    </cfoutput>
    

補充

CGI變數

當瀏覽器發出請求到服務器,Web服務器和瀏覽器創建這個環境變數,包含的資訊有IP位址、瀏覽器類型,驗證用戶名等等。要注意的是這個變數只能用來讀取不能修改。

cfparam vs cfset

  1. cfparam will set a variable only if that variable does not already exist.
  2. cfparam will handle dynamic variable names. For example, this works:
    <cfset var = 1 />
    <cfparam name="foo#var#" default="default" />
    <cfdump var="#foo1#" />
    

上一篇
更合理的方式寫 Javascript
下一篇
ColdFusion: TryCF.com
系列文
網頁服務開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言